package xml;

import java.util.ArrayList;
import java.util.Date;

import org.w3c.dom.Node;

import bean.vo.FacturaVO;
import bean.vo.ItemFacturaVO;

public class SerializadorFactura {
	
	public static Node serializar(Node nodoPadre, FacturaVO factura) throws Exception{
		Node nodoFactura = null;
		
		if (nodoPadre == null) {
			nodoFactura = XmlUtil.createRootNode(Constantes.FACTURA);
		} else {
			nodoFactura = XmlUtil.addChild(nodoPadre, Constantes.FACTURA, null);
		}
		
		XmlUtil.addComment(nodoFactura, Constantes.COMENTARIO_FACTURA);
		XmlUtil.addAttribute(nodoFactura, Constantes.NUMERO, factura.getNumeroFactura());
		Node nodoFechas = XmlUtil.addChild(nodoFactura,Constantes.FECHAS, null);
		XmlUtil.addChild(nodoFechas, Constantes.EMISION, factura.getFechaEmision());
		XmlUtil.addChild(nodoFechas, Constantes.VENCIMIENTO, factura.getFechaVencimiento());
		SerializadorCliente.serializar(nodoFactura, factura.getCliente());
		
		Node nodoCondiciones = XmlUtil.addChild(nodoFactura,Constantes.COND_VENTA, null);
		if (factura.getDescuentoEfectivo() != null) {
			Node nodoPagoContado = XmlUtil.addChild(nodoCondiciones,Constantes.PAGO_CONTADO, null);
			XmlUtil.addChild(nodoPagoContado, Constantes.DESCUENTO, factura.getDescuentoEfectivo());
		}
		if (factura.getCondicionPago().getCantidadDias() != 0) 
		SerializadorCondicionPago.serializar(nodoCondiciones, factura.getCondicionPago());
		
		Node nodoReferencia = XmlUtil.addChild(nodoFactura,Constantes.REFERENCIA, null);
		
		ArrayList<Integer> numerosRemitos = new ArrayList<Integer>();
		ArrayList<Date> fechasRemitos = new ArrayList<Date>();
		
		for (ItemFacturaVO item : factura.getItemsFactura()) {
			if (!numerosRemitos.contains(item.getNumeroRemito())) {
				numerosRemitos.add(item.getNumeroRemito());
				fechasRemitos.add(item.getFechaRemito());
			}
		}
		
		for (int i = 0; i < numerosRemitos.size(); i++) {
			Integer numero = numerosRemitos.get(i);
			Date fecha = fechasRemitos.get(i);
			
			Node nodoRemito = XmlUtil.addChild(nodoReferencia,Constantes.REMITO, null);
			XmlUtil.addChild(nodoRemito,Constantes.NUMERO, numero);
			XmlUtil.addChild(nodoRemito,Constantes.FECHA, fecha);
			
			Node nodoRodamientos = XmlUtil.addChild(nodoRemito,Constantes.RODAMIENTOS, null);
			
			for (ItemFacturaVO item : factura.getItemsFactura()) {
				if (numero.equals(item.getNumeroRemito())) {
					SerializadorItemFactura.serializar(nodoRodamientos, item);
				}
			}
		}
		
		return nodoFactura;
	}
}
